package ve.usb.crm;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.crm.hibernate.*;

import java.security.MessageDigest;
import sun.misc.BASE64Encoder;
import java.util.List;
import java.util.Iterator;
import ve.usb.cohesion.runtime.Pair;
import java.util.ArrayList;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Enumeration;

/**
 * 
 */
public class AccionesUsuario extends CohesionAction {

    /**
     * Called by Struts for the execution of action APreUsuarios.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreUsuarios(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VUsuarios",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
// Genero la lista de personal y la cargo al request como un atributo

            List<Personal> list = (List<Personal>) s.createQuery("from Personal where esActivo = true").list();
            for (Iterator<Personal> it = list.iterator(); it.hasNext();) {
                Personal personal = it.next();
                Hibernate.initialize(personal.getPersonalUsuario());

            }

            request.setAttribute("L_Personal", list);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreUsuario.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreUsuario(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VUsuario",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        //Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            //Se saca el id del personal del request asi sea como atributo o como parametro
            Long idPersonal = (Long) request.getAttribute("idUsuario");
            if (idPersonal == null) {
                String tmp = request.getParameter("idUsuario");
                idPersonal = Long.valueOf(tmp).longValue();
            }


            //Saco de la base de dato el personal que tiene que ver con el usuario
            Personal personal = (Personal) s.createQuery("from Personal where idPersonal = :idPersonal").setLong("idPersonal", idPersonal).uniqueResult();

            //Saco y inicializo el login del usuario
            Usuario usuario = personal.getPersonalUsuario();
            Hibernate.initialize(usuario);

            //Coloco los valores en el request
            request.setAttribute("Usuario", personal);
            request.setAttribute("Login", usuario);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreProfile(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VProfile",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        //Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            //Se saca el id del personal del request asi sea como atributo o como parametro
            Usuario login = (Usuario) request.getSession().getAttribute("Login");

            if (login.getRol().getNombre().compareTo("administrador") == 0 || login.getRol().getNombre().compareTo("empleado") == 0) {

                Personal usuario = (Personal) request.getSession().getAttribute("Usuario");
                request.setAttribute("usuario", usuario);
            }

            if (login.getRol().getNombre().compareTo("cliente") == 0) {
                Contacto usuario = (Contacto) request.getSession().getAttribute("usuario");
                request.setAttribute("usuario", usuario);
            }

            request.setAttribute("login", login);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action AEliminarUsuario.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward AEliminarUsuario(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreUsuarios",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador
        if (!CohesionActor.checkActor(request, 1)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            //Saco el id del usuario del request y saco el personal de la base de dato
            Long idPersonal = lookup_Long(request, "idUsuario");
            Personal personal = (Personal) s.load(Personal.class, idPersonal);

            personal.setEsActivo(false);
            s.save(personal);
            s.flush();

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreEditarUsuario.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreEditarUsuario(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearUsuario",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador, empleado
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            //Saco el usuario de el request y consigo su personal asociado
            String tmp = (String) request.getParameter("idUsuario");
            Long idUsuario = Long.valueOf(tmp).longValue();
            Personal usuario = (Personal) s.createQuery("from Personal where idPersonal = :idPersonal").setLong("idPersonal", idUsuario).uniqueResult();



            //Cargo todos los valores conocidos de el usuario en el formulario
            FCrearUsuario fFCrearUsuario = FCrearUsuario.clear(mapping, request);
            cargarCollection(fFCrearUsuario, s, request);


            fFCrearUsuario.setLogin(usuario.getPersonalUsuario().getAlias());
            fFCrearUsuario.setPassword(usuario.getPersonalUsuario().getClave());
            fFCrearUsuario.setIdUsuario(usuario.getIdPersonal());
            fFCrearUsuario.setNombre(usuario.getNombre());
            fFCrearUsuario.setApellido(usuario.getApellido());
            fFCrearUsuario.setDireccion(usuario.getDireccion());
            fFCrearUsuario.setCorreoE(usuario.getCorreoE());
            fFCrearUsuario.setTelefonoHabitacion(usuario.getTelefonoHabitacion());
            fFCrearUsuario.setTelefonoMovil(usuario.getTelefonoMovil());
            fFCrearUsuario.setTelefonoExt(usuario.getTelefonoExt());

            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            fFCrearUsuario.setFechaNacimiento(df.format(usuario.getFechaNacimiento()));
            fFCrearUsuario.setLugarNacimiento(usuario.getLugarNacimiento());
            fFCrearUsuario.setDepartamento(usuario.getDepartamento());
            fFCrearUsuario.setSueldo(usuario.getSueldo());
            fFCrearUsuario.setRol(usuario.getPersonalUsuario().getRol().getIdCategoria());

            Hibernate.initialize(usuario.getPersonalUsuario().getRol());
            //Agrego en el request el usuario
            request.setAttribute("usuario", usuario);
            request.setAttribute("rol", usuario.getPersonalUsuario().getRol());

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action ACrearUsuario.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward ACrearUsuario(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreUsuarios", "VCrearUsuario",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;

        //Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }

        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();

        try {
            FCrearUsuario fFCrearUsuario = (FCrearUsuario) form;
            //Creo una nueva instancia de el usuario y de el login

            Usuario usuario = new Usuario();
            Categoria rol = new Categoria();
            boolean hayError = false;

            //Se obtiene una categoria de ejemplo para crear el usuario con ese atributo
            //Se verifico si no escojo el 0
            if (fFCrearUsuario.getRol() != 0l) {
                rol = (Categoria) s.load(Categoria.class, fFCrearUsuario.getRol());
            }

            Personal personal = new Personal();
            Contacto contacto = new Contacto();

            //Se verifica si el personal ya existe.
            if (fFCrearUsuario.getIdUsuario() != 0l) {
                // se obtiene el id del Personal
                if (rol.getNombre().compareTo("administrador") == 0 || rol.getNombre().compareTo("empleado") == 0) {
                    personal = (Personal) s.load(Personal.class, fFCrearUsuario.getIdUsuario());
                    usuario = personal.getPersonalUsuario();
                } else if (rol.getNombre().compareTo("cliente") == 0) {
                    contacto = (Contacto) s.load(Contacto.class, fFCrearUsuario.getIdUsuario());
                    usuario = contacto.getContactoUsuario();
                }

//                request.setAttribute("usuario", personal);

//                rol = usuario.getRol();
            }

            //Verifico que el valor del alias sea válido
            if (fFCrearUsuario.getLogin().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("loginError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un alias v&aacute;lido");
            } else if (fFCrearUsuario.getLogin().compareTo(usuario.getAlias()) != 0 && s.createQuery("from Usuario where alias = :login").setString("login", fFCrearUsuario.getLogin()).uniqueResult() != null) {
                hayError = true;
                request.setAttribute("loginError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>El alias ya est&aacute; siendo usado");
            }

            // Se verifica si el usuario es nuevo
            if (fFCrearUsuario.getIdUsuario() == 0l) {
                //Se verifica si la clave no es vacía
                if (fFCrearUsuario.getPassword().compareTo("") == 0l) {
                    hayError = true;
                    request.setAttribute("passwordError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar una clave v&aacute;lida");
                }
                //Se verifica si la clave y la confirmación de la clave son iguales
                if (fFCrearUsuario.getPassword().compareTo(fFCrearUsuario.getPasswordConfirmacion()) == 0) {
                    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
                    messageDigest.update(fFCrearUsuario.getPassword().getBytes());
                    BASE64Encoder base64Encoder = new BASE64Encoder();
                    String encrypPassword = base64Encoder.encode(messageDigest.digest());
                    usuario.setClave(encrypPassword);
                } else {
                    hayError = true;
                    request.setAttribute("passwordError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>La clave y su confirmaci&oacute;n deben ser iguales");
                }
            }

            if (fFCrearUsuario.getNombre().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("nombreError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un nombre v&aacute;lido");
            }
            if (fFCrearUsuario.getApellido().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("apellidoError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un apellido v&aacute;lido");
            }
            if (fFCrearUsuario.getDireccion().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("direccionError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar una direcci&oacute; v&aacute;lida");
            }
            if (fFCrearUsuario.getCorreoE().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("correoEError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un correo electr&oacute;nico v&aacute;lido");
            }
            if (fFCrearUsuario.getFechaNacimiento().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("fechaNacimientoError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar una fecha de nacimiento v&aacute;lido");
            }

            if (hayError) {
                cargarCollection(fFCrearUsuario, s, request);



                if (fFCrearUsuario.getIdUsuario() != 0l) {
                    if (rol.getNombre().compareTo("administrador") == 0 || rol.getNombre().compareTo("empleado") == 0) {
                        request.setAttribute("usuario", personal);
                    } else if (rol.getNombre().compareTo("cliente") == 0) {
                        request.setAttribute("usuario", contacto);
                    }

                }

                salida = SALIDA_1;
            } else {
                salida = SALIDA_0;
                // Se carga el tipo de rol al login
                usuario.setAlias(fFCrearUsuario.getLogin());
                usuario.setRol(rol);

                //Agrego los demas atributos de usuario al objeto usuario
                if (rol.getNombre().compareTo("administrador") == 0 || rol.getNombre().compareTo("empleado") == 0) {
                    personal.setPersonalUsuario(usuario);
                    personal.setNombre(fFCrearUsuario.getNombre());
                    personal.setApellido(fFCrearUsuario.getApellido());
                    personal.setDireccion(fFCrearUsuario.getDireccion());
                    personal.setCorreoE(fFCrearUsuario.getCorreoE());
                    personal.setTelefonoHabitacion(fFCrearUsuario.getTelefonoHabitacion());
                    personal.setTelefonoMovil(fFCrearUsuario.getTelefonoMovil());
                    personal.setTelefonoExt(fFCrearUsuario.getTelefonoExt());
                    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                    personal.setFechaNacimiento(df.parse(fFCrearUsuario.getFechaNacimiento()));
                    personal.setLugarNacimiento(fFCrearUsuario.getLugarNacimiento());
                    personal.setDepartamento(fFCrearUsuario.getDepartamento());
                    personal.setSueldo(fFCrearUsuario.getSueldo());
                    personal.setEsActivo(true);
                } else if (rol.getNombre().compareTo("cliente") == 0) {
                    contacto.setContactoUsuario(usuario);
                    contacto.setNombre(fFCrearUsuario.getNombre());
                    contacto.setApellido(fFCrearUsuario.getApellido());
                    contacto.setDireccion(fFCrearUsuario.getDireccion());
                    contacto.setCorreoE(fFCrearUsuario.getCorreoE());
                    contacto.setTelefonoHabitacion(fFCrearUsuario.getTelefonoHabitacion());
                    contacto.setTelefonoMovil(fFCrearUsuario.getTelefonoMovil());
                    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                    contacto.setFechaNacimiento(df.parse(fFCrearUsuario.getFechaNacimiento()));
                    contacto.setLugarNacimiento(fFCrearUsuario.getLugarNacimiento());
                    contacto.setEsActivo(true);
                    contacto.setEsCliente(true);
                }


                if (fFCrearUsuario.getIdUsuario() != 0l) {
                    s.update(usuario);
                    s.flush();

                    if (rol.getNombre().compareTo("administrador") == 0 || rol.getNombre().compareTo("empleado") == 0) {
                        personal.setIdPersonal(fFCrearUsuario.getIdUsuario());
                        s.update(personal);
                    } else if (rol.getNombre().compareTo("cliente") == 0) {
                        contacto.setIdContacto(fFCrearUsuario.getIdUsuario());
                        s.update(contacto);
                    }


                    s.flush();
                } else {


                    //Se guarda usuario.
                    s.save(usuario);
                    s.flush();

                    if (rol.getNombre().compareTo("administrador") == 0 || rol.getNombre().compareTo("empleado") == 0) {
                        s.save(personal);
                    } else if (rol.getNombre().compareTo("cliente") == 0) {
                        s.save(contacto);
                    }

                    s.flush();
                }
                //Agrego al request el id del personal
            }

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward ACambiarClave(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreHome", "VCambiarClave",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;

        //Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }

        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();

        try {
            FCambiarClave ffCambiarClave = (FCambiarClave) form;

            boolean hayError = false;

            if (ffCambiarClave.getPassword().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("passwordError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Este campo es requerido.");
            }

            if (ffCambiarClave.getPasswordConfirmacion().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("passwordConfirmacionError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Este campo es requerido.");
            }

            if (ffCambiarClave.getViejaPassword().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("viejaPasswordError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Este campo es requerido.");
            }

            if (hayError) {
                salida = SALIDA_1;

            } else {
                //salvo
                salida = SALIDA_0;
            }


            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreCrearUsuario.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreCrearUsuario(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearUsuario",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        //Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            //Creo el formulario vacio
            FCrearUsuario forUsuario = FCrearUsuario.clear(mapping, request);
            cargarCollection(forUsuario, s, request);
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreCambiarClave(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCambiarClave",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        //Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            //Creo el formulario vacio
            FCambiarClave ffCambiarClave = FCambiarClave.clear(mapping, request);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action AConectarse.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward AConectarse(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreHome", "VConectarse",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FConectarse fFConectarse = (FConectarse) form;
//Saco el login de la base de datos
            Usuario login = (Usuario) s.createQuery("from Usuario where alias = :alias").setString("alias", fFConectarse.getAlias()).uniqueResult();

            //Preparo el md5
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(fFConectarse.getClave().getBytes());
            BASE64Encoder base64Encoder = new BASE64Encoder();
            String encrypPassword = base64Encoder.encode(messageDigest.digest());

            //Verifico si el login existe
            if (login == null) {
                salida = SALIDA_1;
                request.setAttribute("msg", "El alias no existe o la clave es incorrecta");
                return mapping.findForward(SALIDAS[salida]);
            }

            //Verifico la Clave
            if (encrypPassword.compareTo(login.getClave()) != 0) {
                salida = SALIDA_1;
                request.setAttribute("msg", "El alias no existe o la clave es incorrecta");
                return mapping.findForward(SALIDAS[salida]);
            }



            //Obtengo el rol
            Categoria rol = login.getRol();

            //Agrego el usuario al request
            if (rol.getNombre().compareTo("empleado") == 0 || rol.getNombre().compareTo("administrador") == 0) {
                Personal usuario = (Personal) s.createQuery("from Personal where personalUsuario = :idLogin").setLong("idLogin", login.getIdUsuario()).uniqueResult();
                if (usuario.getEsActivo()) {
                    request.getSession().setAttribute("Usuario", usuario);
                } else {
                    salida = SALIDA_1;
                    request.setAttribute("msg", "El alias no existe o la clave es incorrecta");
                    return mapping.findForward(SALIDAS[salida]);
                }

            }

            if (rol.getNombre().compareTo("cliente") == 0) {
                Contacto usuario = (Contacto) s.createQuery("from Contacto where contactousuario = :idLogin").setLong("idLogin", login.getIdUsuario()).uniqueResult();
                if (usuario.getEsActivo()) {
                    request.getSession().setAttribute("Usuario", usuario);
                } else {
                    salida = SALIDA_1;
                    request.setAttribute("msg", "El alias no existe o la clave es incorrecta");
                    return mapping.findForward(SALIDAS[salida]);
                }
            }

            //Doy el valor al actor que se deberia tener por la clase cohesion actor

            if (rol.getNombre().compareTo("administrador") == 0) {
                CohesionActor actor = new CohesionActor(CohesionActor.ACTOR_administrador);
                actor.setMe(request);
            } else if (rol.getNombre().compareTo("cliente") == 0) {
                CohesionActor actor = new CohesionActor(CohesionActor.ACTOR_cliente);
                actor.setMe(request);
            } else if (rol.getNombre().compareTo("proveedor") == 0) {
                CohesionActor actor = new CohesionActor(CohesionActor.ACTOR_proveedor);
                actor.setMe(request);
            } else if (rol.getNombre().compareTo("empleado") == 0) {
                CohesionActor actor = new CohesionActor(CohesionActor.ACTOR_empleado);
                actor.setMe(request);


            } else {
                CohesionActor actor = new CohesionActor(CohesionActor.NO_ACTOR);
                actor.setMe(request);
            }





            request.getSession().setAttribute("Login", login);
            if (login.getTheme() != null) {
                request.getSession().setAttribute("theme", login.getTheme().getNombre());
            }



            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }

        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreConectarse.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreConectarse(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VConectarse",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            FConectarse fConectarse = FConectarse.clear(mapping, request);



            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreHome.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreHome(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VHome",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {


            if (CohesionActor.checkActor(request, CohesionActor.ACTOR_administrador + CohesionActor.ACTOR_empleado)) {
                //Obtengo el id cde la cuenta del request asi este como atributo o como parametro
                Personal usuario = (Personal) request.getSession().getAttribute("Usuario");

                //SAco la cuenta de la base de dato
                List<Cuenta> cuentas = (List<Cuenta>) s.createQuery("from Cuenta where respcuenta = :idPersonal").setLong("idPersonal", usuario.getIdPersonal()).list();
                for (Iterator<Cuenta> it = cuentas.iterator(); it.hasNext();) {
                    Cuenta cuenta = it.next();

                    Hibernate.initialize(cuenta.getTipo());
                    Hibernate.initialize(cuenta.getSector());
                }

                //inicializo los datos que necisot


                //Inicializo todos los contactos
                List<Contacto> listaContacto = (List<Contacto>) s.createQuery("from Contacto where persona = :idPersonal and esActivo = true").setLong("idPersonal", usuario.getIdPersonal()).list();
                Hibernate.initialize(listaContacto);

                for (Iterator<Contacto> it = listaContacto.iterator(); it.hasNext();) {
                    Contacto contacto = it.next();
                    Hibernate.initialize(contacto.getCuenta());


                }




                //Iniciliazo todas las oportunidaes
                List<Oportunidad> listaOportunidad = (List<Oportunidad>) s.createQuery("from Oportunidad where respoportunidad = :idPersonal and esActivo = true and concretado = false").setLong("idPersonal", usuario.getIdPersonal()).list();

                for (Iterator<Oportunidad> it = listaOportunidad.iterator(); it.hasNext();) {
                    Oportunidad oportunidad = it.next();
                    Hibernate.initialize(oportunidad.getNombre());
                    Hibernate.initialize(oportunidad.getFechaCierre());
                    Hibernate.initialize(oportunidad.getEtapa().getNombre());


                }

                //Iniciliazo todas los proyectps
                List<Proyecto> listaProyectos = (List<Proyecto>) s.createQuery("from Proyecto where respproyecto = :idPersonal and esActivo = true").setLong("idPersonal", usuario.getIdPersonal()).list();

                for (Iterator<Proyecto> pr = listaProyectos.iterator(); pr.hasNext();) {
                    Proyecto proyectos = pr.next();
                    Hibernate.initialize(proyectos);
                }

                //Iniciliazo todas las tareas relacionadas
                List<Tarea> listaTarea = (List<Tarea>) s.createQuery("from Tarea where personal = :idPersonal and esActivo = true").setLong("idPersonal", usuario.getIdPersonal()).list();

                for (Iterator<Tarea> it = listaTarea.iterator(); it.hasNext();) {
                    Tarea tarea = it.next();
                    Hibernate.initialize(tarea.getPersonal());
                    Hibernate.initialize(tarea.getAsunto());
                    Hibernate.initialize(tarea.getEstado());
                    Hibernate.initialize(tarea.getContactoRelacionado());


                }

                //agrego en el request los atributos
                request.setAttribute("L_Oportunidad", listaOportunidad);
                request.setAttribute("L_Contacto", listaContacto);

                request.setAttribute("L_Tarea", listaTarea);
                request.setAttribute("L_Cuenta", cuentas);
                request.setAttribute("usuario", usuario);
                request.setAttribute("L_Proyecto", listaProyectos);

//                if (tabsActual != null) {
//
//                    request.setAttribute("tabsActual", tabsActual);
//                }


            } else if (CohesionActor.checkActor(request, CohesionActor.ACTOR_cliente)) {
                Contacto usuario = (Contacto) request.getSession().getAttribute("Usuario");


                //SAco la cuenta de la base de dato
                Cuenta cuenta = usuario.getCuenta();

                if (cuenta != null) {

                    Hibernate.initialize(cuenta);

                    //Iniciliazo todas las oportunidaes
                    List<Oportunidad> listaOportunidad = (List<Oportunidad>) s.createQuery("from Oportunidad where cuenta = :idCuenta and esActivo = true and concretado = false").setLong("idCuenta", cuenta.getIdCuenta()).list();

                    for (Iterator<Oportunidad> it = listaOportunidad.iterator(); it.hasNext();) {
                        Oportunidad oportunidad = it.next();

                        Hibernate.initialize(oportunidad.getNombre());
                        Hibernate.initialize(oportunidad.getFechaCierre());
                        Hibernate.initialize(oportunidad.getEtapa().getNombre());


                    }

                    //Iniciliazo todas los proyectps
                    List<Proyecto> listaProyectos = (List<Proyecto>) s.createQuery("from Proyecto where cuenta = :idCuenta and esActivo = true").setLong("idCuenta", cuenta.getIdCuenta()).list();

                    for (Iterator<Proyecto> pr = listaProyectos.iterator(); pr.hasNext();) {
                        Proyecto proyectos = pr.next();

                        Hibernate.initialize(proyectos);
                    }

                    //Iniciliazo todas las tareas relacionadas
                    List<Tarea> listaTarea = (List<Tarea>) s.createQuery("from Tarea where contactoRelacionado = :idContacto and esActivo = true").setLong("contactoRelacionado", usuario.getIdContacto()).list();

                    for (Iterator<Tarea> it = listaTarea.iterator(); it.hasNext();) {
                        Tarea tarea = it.next();


                        Hibernate.initialize(tarea.getPersonal());
                        Hibernate.initialize(tarea.getAsunto());
                        Hibernate.initialize(tarea.getEstado());
                        Hibernate.initialize(tarea.getContactoRelacionado());


                    }

                    request.setAttribute("L_Oportunidad", listaOportunidad);


                    request.setAttribute("L_Tarea", listaTarea);
                    request.setAttribute("Cuenta", cuenta);
                    request.setAttribute("usuario", usuario);
                    request.setAttribute("L_Proyecto", listaProyectos);


                }
            } else {
                /*Codigo de cuando no es un usuario registrado*/
            }
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action ADesconectarse.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward ADesconectarse(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreHome",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors cliente, proveedor, administrador, empleado
        if (!CohesionActor.checkActor(request, 15)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            request.getSession().invalidate();
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreRegistrarCliente.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreRegistrarCliente(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VRegistrarCliente",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FRegistroCliente fRegistroCliente = FRegistroCliente.clear(mapping, request);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action ARegistrarCliente.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward ARegistrarCliente(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VHome", "VRegistrarCliente",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FRegistroCliente fFRegistroCliente = (FRegistroCliente) form;
            Contacto contacto = new Contacto();
            Usuario login = new Usuario();

            boolean hayError = false;
            Categoria rolTipo = (Categoria) s.createQuery("from Categoria where nombre = "
                    + ":nombre and tipo = :idpadre").setString("nombre", "rol"
                    + "").setLong("idpadre", 0l).uniqueResult();
            Categoria rol = (Categoria) s.createQuery("from Categoria where nombre = "
                    + ":nombre and tipo = :idpadre").setString("nombre", "cliente"
                    + "").setLong("idpadre", rolTipo.getIdCategoria()).uniqueResult();

            //Verifico que el valor de login no este vacio
            if (fFRegistroCliente.getAlias().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("aliasError", "El valor de el login es requerido");

            } else if (fFRegistroCliente.getAlias().compareTo(login.getAlias()) != 0 && s.createQuery("from Usuario where alias = :login").setString("login", fFRegistroCliente.getAlias()).uniqueResult() != null) {
                hayError = true;
                request.setAttribute("aliasError", "Ese  alias ya existe");

            } else {
                login.setAlias(fFRegistroCliente.getAlias());
            }


            // Verifico si el usuario esn uevo el usuario es nuevo

            //Verifico si la clave no es vacia
            if (fFRegistroCliente.getClave().compareTo("") == 0l) {
                hayError = true;
                request.setAttribute("claveError", "Debe introducir alguna clave");

            }
            //Verifico si las dos claves son iguales
            if (fFRegistroCliente.getClave().compareTo(fFRegistroCliente.getClaveConfirmacion()) == 0) {
                MessageDigest messageDigest = MessageDigest.getInstance("MD5");
                messageDigest.update(fFRegistroCliente.getClave().getBytes());
                BASE64Encoder base64Encoder = new BASE64Encoder();
                String encrypPassword = base64Encoder.encode(messageDigest.digest());
                login.setClave(encrypPassword);
            } else {
                hayError = true;
                request.setAttribute("claveError", "Las password no son iguales");

            }

            if (fFRegistroCliente.getNombre().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("nombreError", "Es un valor requerido");
            }

            if (fFRegistroCliente.getApellido().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("apellidoError", "Es un valor requerido");
            }

            if (fFRegistroCliente.getTelefonoCasa().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("telefonoCasaError", "Es un valor requerido");
            }

            if (fFRegistroCliente.getCorreoE().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("correoEError", "Es un valor requerido");
            }

            if (hayError) {

                salida = SALIDA_1;

            } else {
                salida = SALIDA_0;

                login.setRol(rol);
                s.save(login);
                s.flush();

                contacto.setNombre(fFRegistroCliente.getNombre());
                contacto.setApellido(fFRegistroCliente.getApellido());
                contacto.setTelefonoHabitacion(fFRegistroCliente.getTelefonoCasa());
                contacto.setTelefonoFax(fFRegistroCliente.getFax());
                contacto.setTelefonoMovil(fFRegistroCliente.getCelular());
                contacto.setCorreoE(fFRegistroCliente.getCorreoE());
                contacto.setEsCliente(true);
                contacto.setEsActivo(true);
                contacto.setContactoUsuario(login);
                //Lo salvo y verifico que se salve

                if (fFRegistroCliente.getIdCliente() != 0) {
                    contacto.setIdContacto(fFRegistroCliente.getIdCliente());
                    s.update(contacto);
                    s.flush();
                } else {
                    s.save(contacto);
                    s.flush();

                }
            }
            // Cargo el tipo de rol al login





            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public void cargarCollection(FCrearUsuario fFCrearUsuario, Session s, HttpServletRequest request) {

        Long rolCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'rol'").uniqueResult();
        List<Pair> listRol = new ArrayList<Pair>();
        if (CohesionActor.checkActor(request, CohesionActor.ACTOR_administrador)) {
            listRol =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                    + "from Categoria where tipo= :idCategoria").setLong("idCategoria", rolCategoria).list();

        } else if (CohesionActor.checkActor(request, CohesionActor.ACTOR_empleado)) {
            listRol =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                    + "from Categoria where tipo= :idCategoria and nombre != :administrador").setLong("idCategoria", rolCategoria).setString("administrador", "administrador").list();

        } else {
            listRol.add(new Pair("Ninguna", 0));
        }
        fFCrearUsuario.setListRolCategoria(listRol);
    }
}
